package com.macro.mall.util;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * <pre>项目名称：
 * 类名称：DateUtil
 * 类描述：
 * 创建时间：2017年3月13日 下午2:51:34
 * 修改时间：2017年3月13日 下午2:51:34
 * 创建人 : xin
 * 修改备注：
 * @version </pre>
 */

public class DateUtil {
    /**
     * 默认时间字符串的格式
     */
    public static final String DEFAULT_FORMAT_STR = "yyyyMMddHHmmss";

    public static final String DATE_FORMAT_STR = "yyyyMMdd";

    public static final String DATE_FORMAT_STR_YYYY_MM_dd = "yyyy-MM-dd";

    public static final String YYYY_MM_DDHHMMSS = "yyyy-MM-dd HH:mm:ss";

    public static final String YYYYMMDDHHMMSS = "yyyy.MM.dd HH:mm:ss";

    /**
     * 获取当前你系统时间
     *
     * @return
     */
    public static String getCurrentTime() {
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        return format.format(new Date());
    }


    /**
     * <pre>getDayBegin(获取当天的开始时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getDayBegin() {
        Calendar cal = new GregorianCalendar();
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

    /**
     * <pre>getDayBegin(获取当天的结束时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getDayEnd() {
        Calendar cal = new GregorianCalendar();
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        return cal.getTime();
    }

    /**
     * <pre>getBeginDayOfYesterday(获取昨天的开始时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getBeginDayOfYesterday() {
        Calendar cal = new GregorianCalendar();
        cal.setTime(getDayBegin());
        cal.add(Calendar.DAY_OF_MONTH, -1);
        return cal.getTime();
    }

    /**
     * <pre>getEndDayOfYesterDay(获取昨天的结束时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getEndDayOfYesterDay() {
        Calendar cal = new GregorianCalendar();
        cal.setTime(getDayEnd());
        cal.add(Calendar.DAY_OF_MONTH, -1);
        return cal.getTime();
    }

    /**
     * <pre>getBeginDayOfTomorrow(获取明天的开始时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getBeginDayOfTomorrow() {
        Calendar cal = new GregorianCalendar();
        cal.setTime(getDayBegin());
        cal.add(Calendar.DAY_OF_MONTH, 1);
        return cal.getTime();
    }

    /**
     * <pre>getEndDayOfTomorrow(获取明天的结束时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getEndDayOfTomorrow() {
        Calendar cal = new GregorianCalendar();
        cal.setTime(getDayEnd());
        cal.add(Calendar.DAY_OF_MONTH, 1);
        return cal.getTime();
    }

    /**
     * <pre>getBeginDayOfWeek(获取本周的开始时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    @SuppressWarnings("unused")
    public static Date getBeginDayOfWeek() {
        Date date = new Date();
        if (date == null) {
            return null;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
        if (dayofweek == 1) {
            dayofweek += 7;
        }
        cal.add(Calendar.DATE, 2 - dayofweek);
        return getDayStartTime(cal.getTime());
    }

    /**
     * <pre>getEndDayOfWeek(获取本周的结束时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getEndDayOfWeek() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getBeginDayOfWeek());
        cal.add(Calendar.DAY_OF_WEEK, 6);
        Date weekEndSta = cal.getTime();
        return getDayEndTime(weekEndSta);
    }

    /**
     * <pre>getBeginDayOfMonth(获取本月的开始时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getBeginDayOfMonth() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(getNowYear(), getNowMonth() - 1, 1);
        return getDayStartTime(calendar.getTime());
    }

    /**
     * <pre>getEndDayOfMonth(获取本月的结束时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getEndDayOfMonth() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(getNowYear(), getNowMonth() - 1, 1);
        int day = calendar.getActualMaximum(5);
        calendar.set(getNowYear(), getNowMonth() - 1, day);
        return getDayEndTime(calendar.getTime());
    }


    /**
     * <pre>getDayStartTime(获取某个日期的月开始时间)
     * 创建人 : xin
     * 修改备注：
     * @param d
     * @return Date </pre>
     */
    public static Date getMonthStartTimeResuDate(Date d) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(getNowYear(), getDateNowMonth(d) - 1, 1);
        return getDayStartTime(calendar.getTime());
    }


    /**
     * <pre>getBeginDayOfYear(获取本年的开始时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getBeginDayOfYear() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, getNowYear());
        // cal.set
        cal.set(Calendar.MONTH, Calendar.JANUARY);
        cal.set(Calendar.DATE, 1);
        return getDayStartTime(cal.getTime());
    }


    /**
     * <pre>getEndDayOfYear(获取本年的结束时间)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Date getEndDayOfYear() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, getNowYear());
        cal.set(Calendar.MONTH, Calendar.DECEMBER);
        cal.set(Calendar.DATE, 31);
        return getDayEndTime(cal.getTime());
    }

    /**
     * <pre>getDayStartTime(获取某个日期的开始时间)
     * 创建人 : xin
     * 修改备注：
     * @param d
     * @return</pre>
     */
    public static Timestamp getDayStartTime(Date d) {
        Calendar calendar = Calendar.getInstance();
        if (null != d) {
            calendar.setTime(d);
        }
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return new Timestamp(calendar.getTimeInMillis());
    }

    /**
     * <pre>getDayEndTime(获取某个日期的结束时间)
     * 创建人 : xin
     * 修改备注：
     * @param d
     * @return</pre>
     */
    public static Timestamp getDayEndTime(Date d) {
        Calendar calendar = Calendar.getInstance();
        if (null != d) {
            calendar.setTime(d);
        }
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return new Timestamp(calendar.getTimeInMillis());
    }

    /**
     * <pre>getDayStartTime(获取某个日期的开始时间)
     * 创建人 : xin
     * 修改备注：
     * @param d
     * @return Date </pre>
     */
    public static Date getDayStartTimeResuDate(Date d) {
        Calendar calendar = Calendar.getInstance();
        if (null != d) {
            calendar.setTime(d);
        }
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return new Date(calendar.getTimeInMillis());
    }

    /**
     * <pre>getDayEndTime(获取某个日期的结束时间)
     * 创建人 : xin
     * 修改备注：
     * @param d
     * @return Date </pre>
     */
    public static Date getDayEndTimeResuDate(Date d) {
        Calendar calendar = Calendar.getInstance();
        if (null != d) {
            calendar.setTime(d);
        }
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return new Date(calendar.getTimeInMillis());
    }

    /**
     * <pre>getNowYear(获取今年是哪一年)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static Integer getNowYear() {
        Date date = new Date();
        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
        gc.setTime(date);
        return Integer.valueOf(gc.get(1));
    }

    /**
     * <pre>getNowMonth(获取本月是哪一月)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static int getNowMonth() {
        Date date = new Date();
        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
        gc.setTime(date);
        return gc.get(2) + 1;
    }

    /**
     * <pre>getNowMonth(根据参数获取是哪一月)
     * 创建人 : xin
     * 修改备注：
     * @return</pre>
     */
    public static int getDateNowMonth(Date d) {
        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
        gc.setTime(d);
        return gc.get(2) + 1;
    }

    /**
     * <pre>getDiffDays(两个日期相减得到的天数)
     * 创建人 : xin
     * 修改备注：
     * @param beginDate
     * @param endDate
     * @return</pre>
     */
    public static int getDiffDays(Date beginDate, Date endDate) {
        if (beginDate == null || endDate == null) {
            throw new IllegalArgumentException("getDiffDays param is null!");
        }

        long diff = (endDate.getTime() - beginDate.getTime())
                / (1000 * 60 * 60 * 24);

        int days = new Long(diff).intValue();

        return days;
    }

    /**
     * <pre>dateDiff(两个日期相减得到的毫秒数)
     * 创建人 : xin
     * 修改备注：
     * @param beginDate
     * @param endDate
     * @return</pre>
     */
    public static long dateDiff(Date beginDate, Date endDate) {
        long date1ms = beginDate.getTime();
        long date2ms = endDate.getTime();
        return date2ms - date1ms;
    }

    /**
     * <pre>max(获取两个日期中的最大日期)
     * 创建人 : xin
     * 修改备注：
     * @param beginDate
     * @param endDate
     * @return</pre>
     */
    public static Date max(Date beginDate, Date endDate) {
        if (beginDate == null) {
            return endDate;
        }
        if (endDate == null) {
            return beginDate;
        }
        if (beginDate.after(endDate)) {
            return beginDate;
        }
        return endDate;
    }

    /**
     * <pre>min(获取两个日期中的最小日期)
     * 创建人 : xin
     * 修改备注：
     * @param beginDate
     * @param endDate
     * @return</pre>
     */
    public static Date min(Date beginDate, Date endDate) {
        if (beginDate == null) {
            return endDate;
        }
        if (endDate == null) {
            return beginDate;
        }
        if (beginDate.after(endDate)) {
            return endDate;
        }
        return beginDate;
    }

    /**
     * <pre>getFirstSeasonDate(返回某月该季度的第一个月)
     * 创建人 : xin
     * 修改备注：
     * @param date
     * @return</pre>
     */
    public static Date getFirstSeasonDate(Date date) {
        final int[] SEASON = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4};
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int sean = SEASON[cal.get(Calendar.MONTH)];
        cal.set(Calendar.MONTH, sean * 3 - 3);
        return cal.getTime();
    }

    /**
     * <pre>getNextDay(返回某个日期下几天的日期)
     * 创建人 : xin
     * 修改备注：
     * @param date
     * @param i
     * @return</pre>
     */
    public static Date getNextDay(Date date, int i) {
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);
        cal.set(Calendar.DATE, cal.get(Calendar.DATE) + i);
        return cal.getTime();
    }

    /**
     * <pre>getFrontDay(返回某个日期前几天的日期)
     * 创建人 : xin
     * 修改备注：
     * @param date
     * @param i
     * @return</pre>
     */
    public static Date getFrontDay(Date date, int i) {
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);
        cal.set(Calendar.DATE, cal.get(Calendar.DATE) - i);
        return cal.getTime();
    }

    /**
     * <pre>getFrontDay(data类型转换字符串)
     * 创建人 : xin
     * 修改备注：
     * @param date
     * @param formatType
     * @return</pre>
     */
    public static String dateToString(Date date, String formatType) {

        return new SimpleDateFormat(formatType).format(date);

    }

    /**
     * <pre>getFrontDay(字符串转data类型)
     * 创建人 : xin
     * 修改备注：
     * @param strTime
     * @param formatType
     * @return</pre>
     */
    public static Date stringToDate(String strTime, String formatType) throws Exception {
        SimpleDateFormat formatter = new SimpleDateFormat(formatType);
        Date date = formatter.parse(strTime);
        return date;
    }


    public static Timestamp getTimestampByLong(long time) {
        Date date = new Date(time);
        return new Timestamp(date.getTime());
    }


}

